package com.testing.sunnycommon.controller;

import com.testing.sunnycommon.model.Result;
import com.testing.sunnycommon.model.SunnyQuartzTask;
import com.testing.sunnycommon.quartz.SunnyQuartzTaskManager;
import com.testing.sunnycommon.service.SunnyQuartzTaskService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @Classname SunnyQuartzTaskController
 * @Description 类型说明
 * @Date 2023/6/21 12:51
 * @Created by 特斯汀Roy
 */
@RestController
@RequestMapping("/sunnyQuartzTask")
@Slf4j
public class SunnyQuartzTaskController {

    @Autowired
    SunnyQuartzTaskService sunnyQuartzTaskService;

    @Autowired
    SunnyQuartzTaskManager sunnyQuartzTaskManager;

    @GetMapping
    public Result<List<SunnyQuartzTask>> listSunnyQuartzTasks() {
        return Result.success(sunnyQuartzTaskService.list());
    }

    @PostMapping
    public Result addSunnyQuartzTask(@RequestBody SunnyQuartzTask sunnyQuartzTask) {
        //先在数据库中记录，注意设置quartzTask对象的TableId，这样会自动回写对象新增之后的id。
        System.out.println("新增前的任务："+sunnyQuartzTask);
        boolean addResult = sunnyQuartzTaskService.save(sunnyQuartzTask);
        if (addResult) {
            try {
                //如果新增，认为一定是要启动这个定时任务，这个时候的sunnyQuartzTask的id是已经新增之后的id
                System.out.println("新增后的任务："+sunnyQuartzTask);
                sunnyQuartzTaskManager.activeQuartzTask(sunnyQuartzTask);
                return Result.success("启动定时任务【" + sunnyQuartzTask.getName() + "】成功", sunnyQuartzTask);
            } catch (Exception e) {
                //注意捕获的时候，要捕获所有的异常，因为cron异常是RuntimeException
                //如果启动任务失败了，则删除数据库中的记录，删除的是新增之后更新的记录。
                sunnyQuartzTaskService.removeById(sunnyQuartzTask);
                log.error("启动定时任务失败，请注意检查定时任务配置", e.fillInStackTrace());
                //如果任务启动失败，就不再向数据库插入这条任务配置数据。
                return Result.fail(1011, "启动定时任务失败，已取消新增，请注意检查定时任务配置", sunnyQuartzTask);
            }
        } else {
            return Result.fail(1010, "新增定时任务失败", sunnyQuartzTask);
        }
    }


    /**
     * 修改定时任务配置的时候，直接先删除日程表中的任务信息并停止它。然后重新创建
     *
     * @param sunnyQuartzTask
     * @return
     */
    @PutMapping
    public Result updateSunnyQuartzTask(@RequestBody SunnyQuartzTask sunnyQuartzTask) {
        //获取原本的任务配置信息
        SunnyQuartzTask oldTask = sunnyQuartzTaskService.getById(sunnyQuartzTask.getId());
        //更新数据库中的内容
        boolean update = sunnyQuartzTaskService.updateById(sunnyQuartzTask);
        try {
            //从任务日程表中删除任务
            sunnyQuartzTaskManager.deleteQuartzTask(oldTask);
            //创建新的定时任务并激活
            sunnyQuartzTaskManager.activeQuartzTask(sunnyQuartzTask);
            //如果设置的是不激活，再关闭它
            if (!sunnyQuartzTask.getIsActive()) {
                sunnyQuartzTaskManager.unActiveQuartzTask(sunnyQuartzTask);
            }
        } catch (Exception e) {
            log.error("启动任务【" + sunnyQuartzTask.getName() + "】失败", e.fillInStackTrace());
            return Result.fail(1020, "设置定时任务【" + sunnyQuartzTask.getName() + "】失败", e.fillInStackTrace());
        }
        if (update) {
            return Result.success("更新任务【" + sunnyQuartzTask.getName() + "】成功", sunnyQuartzTask);
        } else {
            return Result.fail(1020, "更新任务【" + sunnyQuartzTask.getName() + "】失败", sunnyQuartzTask);
        }


    }

    /**
     * 删除任务的时候，需要将任务从日程表中停止并删除。
     *
     * @param id
     * @return
     */
    @DeleteMapping("/{id}")
    public Result deleteSunnyQuartzTask(@PathVariable Long id) {
        //仅仅是为了适配方法传参
        SunnyQuartzTask oldTask = sunnyQuartzTaskService.getById(id);
        //完成数据库中的配置信息删除
        boolean remove = sunnyQuartzTaskService.removeById(id);
        try {
            //完成任务日程表中任务的停止和删除
            sunnyQuartzTaskManager.deleteQuartzTask(oldTask);
        } catch (Exception e) {
            log.error("停止任务【" + oldTask + "】失败", e.fillInStackTrace());
        }
        if (remove) {
            return Result.success("删除任务成功");
        } else {
            return Result.fail(1030, "删除定时任务失败", oldTask);
        }
    }


}
